import os
import subprocess
import shutil
import platform
import sys

def build_python_app():
    """打包Python应用程序为可执行文件"""
    print("=== 开始打包Python应用 ===")
    
    # 检查Python版本
    python_version = sys.version_info
    print(f"当前Python版本: {python_version.major}.{python_version.minor}.{python_version.micro}")
    
    if python_version.major != 3 or python_version.minor != 10:
        print("警告: 当前Python版本不是3.10，TensorFlow 2.9.0需要Python 3.10版本")
        print("请使用Python 3.10版本运行此脚本")
        sys.exit(1)
    
    # 检查是否已安装PyInstaller
    try:
        import PyInstaller
        print(f"PyInstaller版本: {PyInstaller.__version__}")
    except ImportError:
        print("未安装PyInstaller，正在安装...")
        subprocess.check_call(["pip", "install", "pyinstaller", "-i", "https://mirrors.aliyun.com/pypi/simple/"])
    
    # 确保正确的TensorFlow、Keras和protobuf版本
    print("检查TensorFlow、Keras和protobuf版本...")
    subprocess.check_call(["pip", "install", "tensorflow==2.9.0", "keras==2.9.0", "protobuf==3.20.0", "-i", "https://mirrors.aliyun.com/pypi/simple/"])
    
    # 获取当前工作目录
    current_dir = os.getcwd()
    print(f"当前工作目录: {current_dir}")
    
    # 如果不在项目根目录，尝试定位到项目根目录
    if not os.path.exists(os.path.join(current_dir, "main.py")):
        # 尝试向上查找
        parent_dir = os.path.dirname(current_dir)
        if os.path.exists(os.path.join(parent_dir, "main.py")):
            os.chdir(parent_dir)
            current_dir = parent_dir
            print(f"切换到项目根目录: {current_dir}")
    
    # 确认项目根目录存在必要的文件
    if not os.path.exists("main.py") or not os.path.exists("main.spec"):
        raise FileNotFoundError("找不到必要的项目文件 (main.py 或 main.spec)")
    
    # 确保model目录存在
    if not os.path.exists("model"):
        os.makedirs("model")
        print("创建model目录")
    
    # 如果dist目录已存在，删除它以便清洁构建
    if os.path.exists("dist"):
        print("删除旧的dist目录...")
        shutil.rmtree("dist")
    
    # 运行PyInstaller
    print("开始PyInstaller打包...")
    subprocess.check_call(["pyinstaller", "main.spec", "--clean"])
    
    # 打包完成后，检查dist目录
    if os.path.exists(os.path.join("dist", "medical_api_server")):
        print("Python应用打包成功！")
    else:
        raise RuntimeError("Python应用打包失败，请检查错误日志")
    
    # 返回dist目录中的medical_api_server目录的路径
    return os.path.join(current_dir, "dist", "medical_api_server")

if __name__ == "__main__":
    try:
        output_dir = build_python_app()
        print(f"Python应用已打包到: {output_dir}")
    except Exception as e:
        print(f"打包过程中出错: {str(e)}") 